package com.bclz.laziness

object LazinessExample {

  /**
    * if else 也可以算作是一直惰性求值
    * @param condition
    * @param onTrue
    * @param onFalse
    * @tparam A
    * @return
    */
  def if2[A](condition:Boolean,onTrue:()=>A,onFalse:()=>A):A=
    if(condition) onTrue() else onFalse()

  //thunk表示非严格求值
  def if2_2[A](condition:Boolean,onTrue: =>A,onFalse: =>A):A=
    if(condition) onTrue else onFalse

  def ifInt(condition:Boolean,onTrue: =>Int,onFalse: =>Int):Int={

    if(condition) onTrue+onTrue else onFalse+onFalse

  }

  //lazy会在变量第一次被引用的时候执行，并且会缓存结果
  def ifIntLazy(condition:Boolean,onTrue: =>Int,onFalse: =>Int):Int={
    lazy val onTrueLazy=onTrue
    lazy val onFalseLazy=onFalse
    if(condition) onTrueLazy+onTrueLazy else onFalseLazy+onFalseLazy
  }

  def main(args: Array[String]): Unit = {
    //会被执行两次
    println(ifInt(true,{println(1111);1},{println(-1111);-1}))

    println(" --------lazy-------")
    println(ifIntLazy(true,{println(1111);1},{println(-1111);-1}))

  }

}
